1
เกินข้อจำกัดของอาร์เรย์เชิงเส้น: การขยายสู่ข้อมูลหลายมิติ
AI032Lesson 4
00:00

ยินดีต้อนรับสู่ การถ่ายโอนครั้งใหญ่. ในโปรแกรมสำหรับหน่วยประมวลผลหลัก (CPU) เราจะกำหนด วิธีใด ในการวนซ้ำ; ในระบบประมวลผลแบบทั่วไปบนหน่วยประมวลผล (GPGPU) เราจะกำหนด อะไร ลักษณะของการวนซ้ำเป็นอย่างไร ความเปลี่ยนแปลงจากตรรกะที่เน้นคำสั่ง เป็นตรรกะที่เน้นข้อมูล ได้รับพลังงานจาก การสร้างแนวคิดพื้นฐานของเคอร์เนล.

1. โครงร่าง __global__

โดยใช้ __global__ ตัวชี้วัด คุณไม่ได้เขียนฟังก์ชัน—คุณกำลังออกแบบ โครงร่างที่ขยายขนาดได้. การดำเนินการเคอร์เนลเพียงครั้งเดียวแสดงถึงหน่วยงานงานอิสระหนึ่งหน่วย ทำให้หน่วยประมวลผลกราฟิก (GPU) สามารถจัดการงานที่เหมือนกันหลายพันงานในจำนวนคอร์ที่มากมหาศาล โดยไม่จำเป็นต้องควบคุมเธรดด้วยตนเอง

2. ตัวแก้ปัญหาที่อยู่ทั่วโลก

แล้วหนึ่งเธรดจากหลายล้านตัวจะหาเป้าหมายของมันได้อย่างไร? มันใช้ข้อตกลงที่แน่นอนที่เรียกว่าสูตรการระบุตำแหน่ง:

$$\text{threadID} = \text{blockIdx.x} \times \text{blockDim.x} + \text{threadIdx.x}$$

สูตรนี้ทำหน้าที่เป็นระบบพิกัด ช่วยเชื่อมโยงข้อมูลเชิงตรรกะของซอฟต์แวร์ (อาร์เรย์) กับลำดับชั้นทางกายภาพของฮาร์ดแวร์ (บล็อกและเธรด)

อาร์เรย์หน่วยความจำทั่วโลก (10 ล้านองค์ประกอบ)บล็อก 0บล็อก 1บล็อก N-1ดัชนี = 1 * blockDim + threadIdx

3. การกำหนดการดำเนินการ

การตั้งค่า <<<B, T>>> พารามิเตอร์ต่างๆ จะกำหนดรูปร่างของกริด ซึ่งช่วยให้มั่นใจได้ว่า ความสามารถในการขยายขนาดอย่างโปร่งใส: โค้ดของคุณจะทำงานด้วยตรรกะเหมือนกัน ไม่ว่าฮาร์ดแวร์จะมี 2 SM หรือ 80 SM

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>